1 /* 2 Copyright 2021 Northern.tech AS 3 4 This file is part of CFEngine 3 - written and maintained by Northern.tech AS. 5 6 This program is free software; you can redistribute it and/or modify it 7 under the terms of the GNU General Public License as published by the 8 Free Software Foundation; version 3. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 18 19 To the extent this program is licensed as part of the Enterprise 20 versions of CFEngine, the applicable Commercial Open Source License 21 (COSL) may apply to this file if you as a licensee so wish it. See 22 included file COSL.txt. 23 */ 24 25 #ifndef CFENGINE_CF3_DEFS_H 26 #define CFENGINE_CF3_DEFS_H 27 28 /* ALWAYS INCLUDE EITHER THIS FILE OR platform.h FIRST */ 29 30 31 #include <platform.h> 32 33 #include <compiler.h> 34 #include <hash_method.h> /* HashMethod */ 35 #include <sequence.h> 36 #include <logging.h> 37 38 #include <definitions.h> /* CF_MAXVARSIZE, CF_BUFSIZE etc */ 39 #include <cfnet.h> /* ProtocolVersion, etc */ 40 #include <misc_lib.h> /* xsnprintf, ProgrammingError etc */ 41 42 /*******************************************************************/ 43 /* Undef platform specific defines that pollute our namespace */ 44 /*******************************************************************/ 45 46 #ifdef interface 47 #undef interface 48 #endif 49 50 /*******************************************************************/ 51 /* Various defines */ 52 /*******************************************************************/ 53 54 #define CF_MAXFRAGMENT 19 /* abbreviate long promise names to 2*MAXFRAGMENT+3 */ 55 #define CF_NONCELEN (CF_BUFSIZE/16) 56 #define CF_MAXLINKSIZE 256 57 #define CF_PROCCOLS 16 58 #define CF_MACROALPHABET 61 /* a-z, A-Z plus a bit */ 59 #define CF_ALPHABETSIZE 256 60 #define CF_SAMEMODE 7777 61 /* CF_SAME_OWNER/GROUP should be -1; chown(-1) doesn't change ownership. */ 62 #define CF_SAME_OWNER ((uid_t)-1) 63 #define CF_UNKNOWN_OWNER ((uid_t)-2) 64 #define CF_SAME_GROUP ((gid_t)-1) 65 #define CF_UNKNOWN_GROUP ((gid_t)-2) 66 #define CF_INFINITY ((int)999999999) 67 #define CF_MONDAY_MORNING 345600 68 69 #define MINUTES_PER_HOUR 60 70 #define SECONDS_PER_MINUTE 60 71 #define SECONDS_PER_HOUR (60 * SECONDS_PER_MINUTE) 72 #define SECONDS_PER_DAY (24 * SECONDS_PER_HOUR) 73 #define SECONDS_PER_WEEK (7 * SECONDS_PER_DAY) 74 #define SECONDS_PER_YEAR (365 * SECONDS_PER_DAY) 75 76 /* Long-term monitoring constants */ 77 78 #define HOURS_PER_SHIFT 6 79 #define SECONDS_PER_SHIFT (HOURS_PER_SHIFT * SECONDS_PER_HOUR) 80 #define SHIFTS_PER_DAY 4 81 #define SHIFTS_PER_WEEK (4*7) 82 83 #define MAX_MONTH_NAME 9 84 85 #define MAX_DIGEST_BYTES (512 / 8) /* SHA-512 */ 86 #define MAX_DIGEST_HEX (MAX_DIGEST_BYTES * 2) 87 88 89 /*******************************************************************/ 90 91 #define CF_FILECHANGE "file_change.log" 92 #define CF_FILECHANGE_NEW "file_changes.log" 93 #define CF_PROMISE_LOG "promise_summary.log" 94 95 #define CF_ENV_FILE "env_data" 96 97 #define CF_DB_REPAIR_TRIGGER "db_repair_required" 98 99 #define CF_SAVED ".cfsaved" 100 #define CF_EDITED ".cfedited" 101 #define CF_NEW ".cfnew" 102 #define CFD_TERMINATOR "---cfXen/gine/cfXen/gine---" 103 #define CFD_TRUE "CFD_TRUE" 104 #define CFD_FALSE "CFD_FALSE" 105 #define CFD_FALSE_SIZE sizeof(CFD_FALSE) // size of CFD_FALSE including terminator 106 #define CF_ANYCLASS "any" 107 #define CF_SMALL_OFFSET 2 108 109 #define CF_NS ':' // namespace character separator 110 111 /* Mangled namespace and scope characters, in order for the iteration engine 112 * to VariablePut() to THIS scope single elements of namespaced iterables 113 * (slists/containers). See expand.c and iteration.c. */ 114 #define CF_MANGLED_NS '*' 115 #define CF_MANGLED_SCOPE '#' 116 117 /*****************************************************************************/ 118 119 /* Auditing key */ 120 121 typedef enum 122 { // Logging of outcomes in cf-agent.c: 123 PROMISE_RESULT_SKIPPED = 's', // <Also skipped in logging> 124 PROMISE_RESULT_NOOP = 'n', // Kept 125 PROMISE_RESULT_CHANGE = 'c', // Repaired 126 PROMISE_RESULT_WARN = 'w', // Not kept 127 PROMISE_RESULT_FAIL = 'f', // Not kept 128 PROMISE_RESULT_DENIED = 'd', // Not kept 129 PROMISE_RESULT_TIMEOUT = 't', // Timed out 130 PROMISE_RESULT_INTERRUPTED = 'i' // Not kept 131 } PromiseResult; 132 133 /*****************************************************************************/ 134 135 #define CF_FAILEDSTR "BAD: Unspecified server refusal (see verbose server output)" 136 #define CF_CHANGEDSTR1 "BAD: File changed " /* Split this so it cannot be recognized */ 137 #define CF_CHANGEDSTR2 "while copying" 138 139 #define CF_START_DOMAIN "undefined.domain" 140 141 #define CF_GRAINS 64 142 #define CF_NETATTR 7 /* icmp udp dns tcpsyn tcpfin tcpack */ 143 #define CF_MEASURE_INTERVAL (5.0*60.0) 144 #define CF_SHIFT_INTERVAL (6*3600) 145 146 #define CF_OBSERVABLES 100 147 148 /* Special exit codes */ 149 #define EC_EVAL_ABORTED 6 /* like SIGABRT, but signal exit codes are 120+SIG */ 150 151 typedef struct 152 { 153 char *name; 154 char *description; 155 char *units; 156 double expected_minimum; 157 double expected_maximum; 158 bool consolidable; 159 } MonitoringSlot; 160 161 enum observables 162 { 163 ob_users, 164 ob_rootprocs, 165 ob_otherprocs, 166 ob_diskfree, 167 ob_loadavg, 168 ob_netbiosns_in, 169 ob_netbiosns_out, 170 ob_netbiosdgm_in, 171 ob_netbiosdgm_out, 172 ob_netbiosssn_in, 173 ob_netbiosssn_out, 174 ob_imap_in, 175 ob_imap_out, 176 ob_cfengine_in, 177 ob_cfengine_out, 178 ob_nfsd_in, 179 ob_nfsd_out, 180 ob_smtp_in, 181 ob_smtp_out, 182 ob_www_in, 183 ob_www_out, 184 ob_ftp_in, 185 ob_ftp_out, 186 ob_ssh_in, 187 ob_ssh_out, 188 ob_wwws_in, 189 ob_wwws_out, 190 ob_icmp_in, 191 ob_icmp_out, 192 ob_udp_in, 193 ob_udp_out, 194 ob_dns_in, 195 ob_dns_out, 196 ob_tcpsyn_in, 197 ob_tcpsyn_out, 198 ob_tcpack_in, 199 ob_tcpack_out, 200 ob_tcpfin_in, 201 ob_tcpfin_out, 202 ob_tcpmisc_in, 203 ob_tcpmisc_out, 204 ob_webaccess, 205 ob_weberrors, 206 ob_syslog, 207 ob_messages, 208 ob_temp0, 209 ob_temp1, 210 ob_temp2, 211 ob_temp3, 212 ob_cpuall, 213 ob_cpu0, 214 ob_cpu1, 215 ob_cpu2, 216 ob_cpu3, 217 ob_microsoft_ds_in, 218 ob_microsoft_ds_out, 219 ob_www_alt_in, 220 ob_www_alt_out, 221 ob_imaps_in, 222 ob_imaps_out, 223 ob_ldap_in, 224 ob_ldap_out, 225 ob_ldaps_in, 226 ob_ldaps_out, 227 ob_mongo_in, 228 ob_mongo_out, 229 ob_mysql_in, 230 ob_mysql_out, 231 ob_postgresql_in, 232 ob_postgresql_out, 233 ob_ipp_in, 234 ob_ipp_out, 235 ob_spare 236 }; 237 238 #include <statistics.h> /* QPoint */ 239 240 typedef struct 241 { 242 time_t t; 243 QPoint Q; 244 } Event; 245 246 typedef struct 247 { 248 time_t last_seen; 249 QPoint Q[CF_OBSERVABLES]; 250 } Averages; 251 252 253 /******************************************************************/ 254 255 /** Data for an individual promise (lock), as it's stored in the lock DB 256 * (/var/cfengine/state/cf_lock.lmdb). This is the value, the key is an MD5 257 * hash of various strings identifying the promise. 258 * 259 * Most C code doesn't use this struct directly, instead AcquireLock() is called 260 * which uses functions in locks.c to read the LockData from LMDB and create a 261 * new CfLock struct. 262 * 263 * Please ensure the padding in this struct is initialized to 0 264 * LockData lock = { 0 }; // Will zero padding as well as members 265 * lock.pid = [...] 266 */ 267 typedef struct 268 { 269 pid_t pid; // 4 bytes 270 // 4 bytes padding 271 time_t time; // 8 bytes 272 time_t process_start_time; // 8 bytes 273 } LockData; 274 275 /*****************************************************************************/ 276 277 #ifdef __MINGW32__ 278 # define NULLFILE "nul" 279 # define EXEC_SUFFIX ".exe" 280 #else 281 # define NULLFILE "/dev/null" 282 # define EXEC_SUFFIX "" 283 #endif /* !__MINGW32__ */ 284 285 #define CF_WORDSIZE 8 /* Number of bytes in a word */ 286 287 /*******************************************************************/ 288 289 typedef struct Item_ Item; 290 291 /*******************************************************************/ 292 293 typedef enum 294 { 295 CF_SIZE_ABS, 296 CF_SIZE_PERCENT 297 } CfSize; 298 299 /*******************************************************************/ 300 301 typedef enum 302 { 303 CONTEXT_STATE_POLICY_RESET, /* Policy when trying to add already defined persistent states */ 304 CONTEXT_STATE_POLICY_PRESERVE 305 } PersistentClassPolicy; 306 307 /*******************************************************************/ 308 309 typedef struct UidList_ UidList; 310 311 // TODO: why do UIDs have their own list type? Clean up. 312 struct UidList_ 313 { 314 #ifdef __MINGW32__ // TODO: remove uid for NT ? 315 char sid[CF_MAXSIDSIZE]; /* Invalid sid indicates unset */ 316 #endif /* __MINGW32__ */ 317 uid_t uid; 318 char *uidname; /* when uid is -2 */ 319 UidList *next; 320 }; 321 322 /*******************************************************************/ 323 324 typedef struct GidList_ GidList; 325 326 // TODO: why do UIDs have their own list type? Clean up. 327 struct GidList_ 328 { 329 gid_t gid; 330 char *gidname; /* when gid is -2 */ 331 GidList *next; 332 }; 333 334 /*************************************************************************/ 335 /* Fundamental (meta) types */ 336 /*************************************************************************/ 337 338 #define CF_UNDEFINED -1 339 #define CF_NOINT -678L 340 #define CF_UNDEFINED_ITEM (void *)0x1234 341 342 #define DEFAULTMODE ((mode_t)0755) 343 344 #define CF_DONEPASSES 4 345 346 #define CFPULSETIME 60 347 348 /*************************************************************************/ 349 /* Parsing and syntax tree structures */ 350 /*************************************************************************/ 351 352 extern const int CF3_MODULES; 353 354 /*************************************************************************/ 355 356 typedef struct Policy_ Policy; 357 typedef struct Bundle_ Bundle; 358 typedef struct Body_ Body; 359 typedef struct Promise_ Promise; 360 typedef struct BundleSection_ BundleSection; 361 typedef struct FnCall_ FnCall; 362 363 /*************************************************************************/ 364 /* Abstract datatypes */ 365 /*************************************************************************/ 366 367 typedef enum 368 { 369 CF_DATA_TYPE_STRING, 370 CF_DATA_TYPE_INT, 371 CF_DATA_TYPE_REAL, 372 CF_DATA_TYPE_STRING_LIST, 373 CF_DATA_TYPE_INT_LIST, 374 CF_DATA_TYPE_REAL_LIST, 375 CF_DATA_TYPE_OPTION, 376 CF_DATA_TYPE_OPTION_LIST, 377 CF_DATA_TYPE_BODY, 378 CF_DATA_TYPE_BUNDLE, 379 CF_DATA_TYPE_CONTEXT, 380 CF_DATA_TYPE_CONTEXT_LIST, 381 CF_DATA_TYPE_INT_RANGE, 382 CF_DATA_TYPE_REAL_RANGE, 383 CF_DATA_TYPE_COUNTER, 384 CF_DATA_TYPE_CONTAINER, 385 CF_DATA_TYPE_NONE 386 } DataType; 387 388 /*************************************************************************/ 389 390 #define CF_COMMONC "common" 391 #define CF_AGENTC "agent" 392 #define CF_SERVERC "server" 393 #define CF_MONITORC "monitor" 394 #define CF_EXECC "executor" 395 #define CF_RUNC "runagent" 396 #define CF_KEYGEN "keygenerator" 397 #define CF_HUBC "hub" 398 399 typedef enum 400 { 401 AGENT_TYPE_COMMON, 402 AGENT_TYPE_AGENT, 403 AGENT_TYPE_SERVER, 404 AGENT_TYPE_MONITOR, 405 AGENT_TYPE_EXECUTOR, 406 AGENT_TYPE_RUNAGENT, 407 AGENT_TYPE_KEYGEN, 408 AGENT_TYPE_HUB, 409 AGENT_TYPE_NOAGENT 410 } AgentType; 411 412 /*************************************************************************/ 413 414 typedef enum 415 { 416 COMMON_CONTROL_BUNDLESEQUENCE, 417 COMMON_CONTROL_GOALPATTERNS, 418 COMMON_CONTROL_IGNORE_MISSING_BUNDLES, 419 COMMON_CONTROL_IGNORE_MISSING_INPUTS, 420 COMMON_CONTROL_INPUTS, 421 COMMON_CONTROL_VERSION, 422 COMMON_CONTROL_LASTSEEN_EXPIRE_AFTER, 423 COMMON_CONTROL_OUTPUT_PREFIX, 424 COMMON_CONTROL_DOMAIN, 425 COMMON_CONTROL_REQUIRE_COMMENTS, 426 COMMON_CONTROL_LICENSES, 427 COMMON_CONTROL_SITE_CLASSES, 428 COMMON_CONTROL_SYSLOG_HOST, 429 COMMON_CONTROL_SYSLOG_PORT, 430 COMMON_CONTROL_SYSTEM_LOG_LEVEL, 431 COMMON_CONTROL_FIPS_MODE, 432 COMMON_CONTROL_BWLIMIT, 433 COMMON_CONTROL_CACHE_SYSTEM_FUNCTIONS, 434 COMMON_CONTROL_PROTOCOL_VERSION, 435 COMMON_CONTROL_TLS_CIPHERS, 436 COMMON_CONTROL_TLS_MIN_VERSION, 437 COMMON_CONTROL_PACKAGE_INVENTORY, 438 COMMON_CONTROL_PACKAGE_MODULE, 439 COMMON_CONTROL_MAX 440 } CommonControl; 441 442 /*************************************************************************/ 443 444 typedef enum 445 { 446 AGENT_CONTROL_ABORTCLASSES, 447 AGENT_CONTROL_ABORTBUNDLECLASSES, 448 AGENT_CONTROL_ADDCLASSES, 449 AGENT_CONTROL_AGENTACCESS, 450 AGENT_CONTROL_AGENTFACILITY, 451 AGENT_CONTROL_ALLCLASSESREPORT, 452 AGENT_CONTROL_ALWAYSVALIDATE, 453 AGENT_CONTROL_AUDITING, 454 AGENT_CONTROL_BINARYPADDINGCHAR, 455 AGENT_CONTROL_BINDTOINTERFACE, 456 AGENT_CONTROL_HASHUPDATES, 457 AGENT_CONTROL_CHILDLIBPATH, 458 AGENT_CONTROL_CHECKSUM_ALERT_TIME, 459 AGENT_CONTROL_DEFAULTCOPYTYPE, 460 AGENT_CONTROL_DRYRUN, 461 AGENT_CONTROL_EDITBINARYFILESIZE, 462 AGENT_CONTROL_EDITFILESIZE, 463 AGENT_CONTROL_ENVIRONMENT, 464 AGENT_CONTROL_EXCLAMATION, 465 AGENT_CONTROL_EXPIREAFTER, 466 AGENT_CONTROL_FSINGLECOPY, 467 AGENT_CONTROL_FAUTODEFINE, 468 AGENT_CONTROL_HOSTNAMEKEYS, 469 AGENT_CONTROL_IFELAPSED, 470 AGENT_CONTROL_INFORM, 471 AGENT_CONTROL_INTERMITTENCY, 472 AGENT_CONTROL_MAX_CHILDREN, 473 AGENT_CONTROL_MAXCONNECTIONS, 474 AGENT_CONTROL_MOUNTFILESYSTEMS, 475 AGENT_CONTROL_NONALPHANUMFILES, 476 AGENT_CONTROL_REPCHAR, 477 AGENT_CONTROL_REFRESH_PROCESSES, 478 AGENT_CONTROL_REPOSITORY, 479 AGENT_CONTROL_SECUREINPUT, 480 AGENT_CONTROL_SENSIBLECOUNT, 481 AGENT_CONTROL_SENSIBLESIZE, 482 AGENT_CONTROL_SKIPIDENTIFY, 483 AGENT_CONTROL_SUSPICIOUSNAMES, 484 AGENT_CONTROL_SYSLOG, 485 AGENT_CONTROL_TRACK_VALUE, 486 AGENT_CONTROL_TIMEZONE, 487 AGENT_CONTROL_TIMEOUT, 488 AGENT_CONTROL_VERBOSE, 489 AGENT_CONTROL_REPORTCLASSLOG, 490 AGENT_CONTROL_SELECT_END_MATCH_EOF, 491 AGENT_CONTROL_NONE 492 } AgentControl; 493 494 /*************************************************************************/ 495 496 typedef enum 497 { 498 EXEC_CONTROL_SPLAYTIME, 499 EXEC_CONTROL_MAILFROM, 500 EXEC_CONTROL_MAILTO, 501 EXEC_CONTROL_MAILSUBJECT, 502 EXEC_CONTROL_SMTPSERVER, 503 EXEC_CONTROL_MAILMAXLINES, 504 EXEC_CONTROL_MAILFILTER_INCLUDE, 505 EXEC_CONTROL_MAILFILTER_EXCLUDE, 506 EXEC_CONTROL_SCHEDULE, 507 EXEC_CONTROL_EXECUTORFACILITY, 508 EXEC_CONTROL_EXECCOMMAND, 509 EXEC_CONTROL_AGENT_EXPIREAFTER, 510 EXEC_CONTROL_RUNAGENT_ALLOW_USERS, 511 EXEC_CONTROL_NONE 512 } ExecControl; 513 514 typedef enum 515 { 516 EDIT_ORDER_BEFORE, 517 EDIT_ORDER_AFTER 518 } EditOrder; 519 520 /*************************************************************************/ 521 522 typedef enum 523 { 524 TYPE_SEQUENCE_META, 525 TYPE_SEQUENCE_VARS, 526 TYPE_SEQUENCE_DEFAULTS, 527 TYPE_SEQUENCE_CONTEXTS, 528 TYPE_SEQUENCE_USERS, 529 TYPE_SEQUENCE_FILES, 530 TYPE_SEQUENCE_PACKAGES, 531 TYPE_SEQUENCE_ENVIRONMENTS, 532 TYPE_SEQUENCE_METHODS, 533 TYPE_SEQUENCE_PROCESSES, 534 TYPE_SEQUENCE_SERVICES, 535 TYPE_SEQUENCE_COMMANDS, 536 TYPE_SEQUENCE_STORAGE, 537 TYPE_SEQUENCE_DATABASES, 538 TYPE_SEQUENCE_REPORTS, 539 TYPE_SEQUENCE_NONE 540 } TypeSequence; 541 542 /*************************************************************************/ 543 /* Syntax module range/pattern constants for type validation */ 544 /*************************************************************************/ 545 546 #define CF_BUNDLE (void*)1234 /* any non-null value, not used */ 547 548 /* Initial values for max=low, min=high when determining a range, for 549 * which we'll revise max upwards and in downwards if given meaningful 550 * bounds for them. Quite why they're these values, rather than 9999 551 * (longest string of 9s to fit in an int16) or 999999999 (similar for 552 * int32) remains a mystery. */ 553 #define CF_HIGHINIT 999999L 554 #define CF_LOWINIT -999999L 555 556 #define CF_SIGNALRANGE "hup,int,trap,kill,pipe,cont,abrt,stop,quit,term,child,usr1,usr2,bus,segv" 557 #define CF_BOOL "true,false,yes,no,on,off" 558 #define CF_LINKRANGE "symlink,hardlink,relative,absolute" 559 #define CF_TIMERANGE "0,2147483647" /* i.e. "0,0x7fffffff" */ 560 561 /* Syntax checker accepts absurdly big numbers for backwards 562 * compatibility. WARNING: internally they are stored as longs, possibly 563 * being truncated to LONG_MAX within IntFromString(). */ 564 #define CF_VALRANGE "0,99999999999" 565 #define CF_INTRANGE "-99999999999,99999999999" 566 567 #define CF_INTLISTRANGE "[-0-9_$(){}\\[\\].]+" 568 #define CF_REALRANGE "-9.99999E100,9.99999E100" 569 #define CF_CHARRANGE "^.$" 570 571 #define CF_MODERANGE "[0-7augorwxst,+-=]+" 572 #define CF_BSDFLAGRANGE "[+-]*[(arch|archived|nodump|opaque|sappnd|sappend|schg|schange|simmutable|sunlnk|sunlink|uappnd|uappend|uchg|uchange|uimmutable|uunlnk|uunlink)]+" 573 #define CF_CLASSRANGE "[a-zA-Z0-9_!&@@$|.()\\[\\]{}:]+" 574 #define CF_IDRANGE "[a-zA-Z0-9_$(){}\\[\\].:]+" 575 #define CF_USERRANGE "[a-zA-Z0-9_$.-]+" 576 #define CF_IPRANGE "[a-zA-Z0-9_$(){}.:-]+" 577 #define CF_FNCALLRANGE "[a-zA-Z0-9_(){}.$@]+" 578 #define CF_NAKEDLRANGE "@[(][a-zA-Z0-9_$(){}\\[\\].:]+[)]" 579 #define CF_ANYSTRING ".*" 580 581 #define CF_KEYSTRING "^(SHA|MD5)=[0123456789abcdef]*$" 582 583 584 #ifndef __MINGW32__ 585 # define CF_ABSPATHRANGE "\"?(/.*)" 586 #else 587 // can start with e.g. c:\... or "c:\... | unix (for Cygwin-style paths) 588 # define CF_ABSPATHRANGE "\"?(([a-zA-Z]:\\\\.*)|(/.*))" 589 #endif 590 591 /* Any non-empty string can be an absolute path under Unix */ 592 #define CF_PATHRANGE ".+" 593 594 // Put this here now for caching efficiency 595 596 #define SOFTWARE_PACKAGES_CACHE "software_packages.csv" 597 #define SOFTWARE_PATCHES_CACHE "software_patches_avail.csv" 598 599 #define PACKAGES_CONTEXT "cf_pack_context" 600 #define PACKAGES_CONTEXT_ANYVER "cf_pack_context_anyver" 601 602 /*************************************************************************/ 603 604 typedef struct EvalContext_ EvalContext; 605 606 typedef enum 607 { 608 RVAL_TYPE_SCALAR = 's', 609 RVAL_TYPE_LIST = 'l', 610 RVAL_TYPE_FNCALL = 'f', 611 RVAL_TYPE_CONTAINER = 'c', 612 RVAL_TYPE_NOPROMISEE = 'X' // TODO: must be another hack 613 } RvalType; 614 615 typedef struct 616 { 617 void *item; 618 RvalType type; 619 } Rval; 620 621 typedef struct Rlist_ Rlist; 622 623 typedef struct ConstraintSyntax_ ConstraintSyntax; 624 typedef struct BodySyntax_ BodySyntax; 625 626 /* 627 * Promise types or bodies may optionally provide parse-tree check function, called after 628 * parsing to do a preliminary syntax/semantic checking of unexpanded promises. 629 * 630 * This check function should populate #errors sequence with errors it finds and 631 * return false in case it has found at least one error. 632 * 633 * If the check function has not found any errors, it should return true. 634 */ 635 typedef bool (*PromiseCheckFn)(const Promise *pp, Seq *errors); 636 typedef bool (*BodyCheckFn)(const Body *body, Seq *errors); 637 638 typedef enum 639 { 640 SYNTAX_STATUS_NORMAL, 641 SYNTAX_STATUS_DEPRECATED, 642 SYNTAX_STATUS_REMOVED 643 } SyntaxStatus; 644 645 typedef enum 646 { 647 FNCALL_CATEGORY_SYSTEM, 648 FNCALL_CATEGORY_FILES, 649 FNCALL_CATEGORY_IO, 650 FNCALL_CATEGORY_COMM, 651 FNCALL_CATEGORY_DATA, 652 FNCALL_CATEGORY_UTILS, 653 FNCALL_CATEGORY_INTERNAL 654 } FnCallCategory; 655 656 struct ConstraintSyntax_ 657 { 658 const char *lval; 659 const DataType dtype; 660 union 661 { 662 const char *validation_string; 663 const BodySyntax *body_type_syntax; 664 } range; 665 const char *description; 666 SyntaxStatus status; 667 }; 668 669 struct BodySyntax_ 670 { 671 const char *body_type; 672 const ConstraintSyntax *constraints; 673 BodyCheckFn check_body; 674 SyntaxStatus status; 675 }; 676 677 typedef struct 678 { 679 const char *bundle_type; 680 const char *promise_type; 681 const ConstraintSyntax *constraints; 682 const PromiseCheckFn check_promise; 683 SyntaxStatus status; 684 } PromiseTypeSyntax; 685 686 /*************************************************************************/ 687 688 typedef struct Constraint_ Constraint; 689 690 typedef enum 691 { 692 INTERVAL_HOURLY, 693 INTERVAL_DAILY, 694 INTERVAL_NONE 695 } Interval; 696 697 typedef enum 698 { 699 FILE_COMPARATOR_ATIME, 700 FILE_COMPARATOR_MTIME, 701 FILE_COMPARATOR_CTIME, 702 FILE_COMPARATOR_CHECKSUM, 703 FILE_COMPARATOR_HASH, 704 FILE_COMPARATOR_BINARY, 705 FILE_COMPARATOR_EXISTS, 706 FILE_COMPARATOR_NONE 707 } FileComparator; 708 709 typedef enum 710 { 711 FILE_LINK_TYPE_SYMLINK, 712 FILE_LINK_TYPE_HARDLINK, 713 FILE_LINK_TYPE_RELATIVE, 714 FILE_LINK_TYPE_ABSOLUTE, 715 FILE_LINK_TYPE_NONE 716 } FileLinkType; 717 718 enum cfopaction 719 { 720 cfa_fix, 721 cfa_warn, 722 }; 723 724 typedef enum 725 { 726 BACKUP_OPTION_BACKUP, 727 BACKUP_OPTION_NO_BACKUP, 728 BACKUP_OPTION_TIMESTAMP, 729 BACKUP_OPTION_ROTATE, 730 BACKUP_OPTION_REPOSITORY_STORE /* for internal use only */ 731 } BackupOption; 732 733 enum cfnofile 734 { 735 cfa_force, 736 cfa_delete, 737 cfa_skip 738 }; 739 740 enum cflinkchildren 741 { 742 cfa_override, 743 cfa_onlynonexisting 744 }; 745 746 typedef enum 747 { 748 FILE_CHANGE_REPORT_NONE, 749 FILE_CHANGE_REPORT_CONTENT_CHANGE, 750 FILE_CHANGE_REPORT_STATS_CHANGE, 751 FILE_CHANGE_REPORT_ALL 752 } FileChangeReport; 753 754 enum signalnames 755 { 756 cfa_hup, 757 cfa_int, 758 cfa_trap, 759 cfa_kill, 760 cfa_pipe, 761 cfa_cont, 762 cfa_abrt, 763 cfa_stop, 764 cfa_quit, 765 cfa_term, 766 cfa_child, 767 cfa_usr1, 768 cfa_usr2, 769 cfa_bus, 770 cfa_segv 771 }; 772 773 typedef enum 774 { 775 PACKAGE_ACTION_ADD, 776 PACKAGE_ACTION_DELETE, 777 PACKAGE_ACTION_REINSTALL, 778 PACKAGE_ACTION_UPDATE, 779 PACKAGE_ACTION_ADDUPDATE, 780 PACKAGE_ACTION_PATCH, 781 PACKAGE_ACTION_VERIFY, 782 PACKAGE_ACTION_NONE 783 } PackageAction; 784 785 typedef enum 786 { 787 NEW_PACKAGE_ACTION_ABSENT, 788 NEW_PACKAGE_ACTION_PRESENT, 789 NEW_PACKAGE_ACTION_NONE 790 } NewPackageAction; 791 792 typedef enum 793 { 794 PACKAGE_VERSION_COMPARATOR_EQ, 795 PACKAGE_VERSION_COMPARATOR_NEQ, 796 PACKAGE_VERSION_COMPARATOR_GT, 797 PACKAGE_VERSION_COMPARATOR_LT, 798 PACKAGE_VERSION_COMPARATOR_GE, 799 PACKAGE_VERSION_COMPARATOR_LE, 800 PACKAGE_VERSION_COMPARATOR_NONE 801 } PackageVersionComparator; 802 803 typedef enum 804 { 805 PACKAGE_ACTION_POLICY_INDIVIDUAL, 806 PACKAGE_ACTION_POLICY_BULK, 807 PACKAGE_ACTION_POLICY_NONE 808 } PackageActionPolicy; 809 810 typedef enum 811 { 812 PROMISE_STATE_REPAIRED = 'r', 813 PROMISE_STATE_NOTKEPT = 'n', 814 PROMISE_STATE_KEPT = 'c', 815 PROMISE_STATE_ANY = 'x' 816 } PromiseState; 817 818 /************************************************************************************/ 819 820 typedef enum 821 { 822 LAST_SEEN_DIRECTION_INCOMING = '-', 823 LAST_SEEN_DIRECTION_OUTGOING = '+' 824 } LastSeenDirection; 825 826 /************************************************************************************/ 827 828 typedef enum 829 { 830 ACL_METHOD_APPEND, 831 ACL_METHOD_OVERWRITE, 832 ACL_METHOD_NONE 833 } AclMethod; 834 835 typedef enum 836 { 837 ACL_TYPE_GENERIC, 838 ACL_TYPE_POSIX, 839 ACL_TYPE_NTFS_, 840 ACL_TYPE_NONE 841 } AclType; 842 843 typedef enum 844 { 845 ACL_DEFAULT_NO_CHANGE, 846 ACL_DEFAULT_SPECIFY, 847 ACL_DEFAULT_ACCESS, 848 ACL_DEFAULT_CLEAR, 849 ACL_DEFAULT_NONE 850 } AclDefault; 851 852 typedef enum 853 { 854 ACL_INHERIT_FALSE, 855 ACL_INHERIT_TRUE, 856 ACL_INHERIT_NOCHANGE 857 } AclInherit; 858 859 typedef struct 860 { 861 AclMethod acl_method; 862 AclType acl_type; 863 AclDefault acl_default; 864 Rlist *acl_entries; 865 Rlist *acl_default_entries; 866 /* Only used on Windows */ 867 AclInherit acl_inherit; 868 } Acl; 869 870 typedef enum 871 { 872 INHERIT_ACCESS_ONLY, 873 INHERIT_DEFAULT_ONLY, 874 INHERIT_ACCESS_AND_DEFAULT 875 } 876 inherit_t; 877 878 typedef enum 879 { 880 INSERT_MATCH_TYPE_IGNORE_LEADING, 881 INSERT_MATCH_TYPE_IGNORE_TRAILING, 882 INSERT_MATCH_TYPE_IGNORE_EMBEDDED, 883 INSERT_MATCH_TYPE_EXACT 884 } InsertMatchType; 885 886 /*************************************************************************/ 887 /* Runtime constraint structures */ 888 /*************************************************************************/ 889 890 #define OVECCOUNT 30 891 892 /*******************************************************************/ 893 894 typedef struct 895 { 896 char *last; 897 char *lock; 898 bool is_dummy; 899 } CfLock; 900 901 /*************************************************************************/ 902 903 typedef struct 904 { 905 char *host; 906 char *source; 907 char *mounton; 908 char *options; 909 int unmount; 910 } Mount; 911 912 /*************************************************************************/ 913 914 typedef struct 915 { 916 int travlinks; 917 int rmdeadlinks; 918 int depth; 919 int xdev; 920 int include_basedir; 921 Rlist *include_dirs; 922 Rlist *exclude_dirs; 923 } DirectoryRecursion; 924 925 /*************************************************************************/ 926 927 typedef struct 928 { 929 enum cfopaction action; 930 int ifelapsed; 931 int expireafter; 932 int background; 933 char *log_string; 934 char *log_kept; 935 char *log_repaired; 936 char *log_failed; 937 int log_priority; 938 char *measure_id; 939 int audit; 940 LogLevel report_level; 941 LogLevel log_level; 942 } TransactionContext; 943 944 /*************************************************************************/ 945 946 typedef enum 947 { 948 CONTEXT_SCOPE_NAMESPACE, 949 CONTEXT_SCOPE_BUNDLE, 950 CONTEXT_SCOPE_NONE 951 } ContextScope; 952 953 typedef struct 954 { 955 ContextScope scope; 956 Rlist *change; 957 Rlist *failure; 958 Rlist *denied; 959 Rlist *timeout; 960 Rlist *kept; 961 int persist; 962 PersistentClassPolicy timer; 963 Rlist *del_change; 964 Rlist *del_kept; 965 Rlist *del_notkept; 966 Rlist *retcode_kept; 967 Rlist *retcode_repaired; 968 Rlist *retcode_failed; 969 } DefineClasses; 970 971 /*************************************************************************/ 972 /* SQL Database connectors */ 973 /*************************************************************************/ 974 975 typedef enum 976 { 977 DATABASE_TYPE_MYSQL, 978 DATABASE_TYPE_POSTGRES, 979 DATABASE_TYPE_NONE 980 } DatabaseType; 981 982 /*************************************************************************/ 983 /* Package promises */ 984 /*************************************************************************/ 985 986 typedef struct PackageItem_ PackageItem; 987 typedef struct PackageManager_ PackageManager; 988 989 struct PackageManager_ 990 { 991 char *manager; 992 PackageAction action; 993 PackageActionPolicy policy; 994 PackageItem *pack_list; 995 PackageItem *patch_list; 996 PackageItem *patch_avail; 997 PackageManager *next; 998 }; 999 1000 /*************************************************************************/ 1001 1002 struct PackageItem_ 1003 { 1004 char *name; 1005 char *version; 1006 char *arch; 1007 Promise *pp; 1008 PackageItem *next; 1009 }; 1010 1011 1012 typedef struct 1013 { 1014 unsigned int expires; 1015 PersistentClassPolicy policy; 1016 char tags[]; // variable length, must be zero terminated 1017 } PersistentClassInfo; 1018 1019 /*************************************************************************/ 1020 1021 typedef struct 1022 { 1023 mode_t plus; 1024 mode_t minus; 1025 UidList *owners; 1026 GidList *groups; 1027 char *findertype; 1028 u_long plus_flags; /* for *BSD chflags */ 1029 u_long minus_flags; /* for *BSD chflags */ 1030 int rxdirs; 1031 } FilePerms; 1032 1033 /*************************************************************************/ 1034 1035 typedef struct 1036 { 1037 Rlist *name; 1038 Rlist *path; 1039 Rlist *perms; 1040 Rlist *bsdflags; 1041 Rlist *owners; 1042 Rlist *groups; 1043 long max_size; 1044 long min_size; 1045 time_t max_ctime; 1046 time_t min_ctime; 1047 time_t max_mtime; 1048 time_t min_mtime; 1049 time_t max_atime; 1050 time_t min_atime; 1051 char *exec_regex; 1052 char *exec_program; 1053 Rlist *filetypes; 1054 Rlist *issymlinkto; 1055 char *result; 1056 } FileSelect; 1057 1058 /*************************************************************************/ 1059 1060 typedef struct 1061 { 1062 enum 1063 { 1064 TIDY_LINK_DELETE, 1065 TIDY_LINK_KEEP 1066 } dirlinks; 1067 int rmdirs; 1068 } FileDelete; 1069 1070 /*************************************************************************/ 1071 1072 typedef struct 1073 { 1074 char *newname; 1075 char *disable_suffix; 1076 int disable; 1077 int rotate; 1078 mode_t plus; 1079 mode_t minus; 1080 } FileRename; 1081 1082 /*************************************************************************/ 1083 1084 typedef struct 1085 { 1086 HashMethod hash; 1087 FileChangeReport report_changes; 1088 int report_diffs; 1089 int update; 1090 } FileChange; 1091 1092 /*************************************************************************/ 1093 1094 typedef struct 1095 { 1096 char *source; 1097 FileLinkType link_type; 1098 Rlist *copy_patterns; 1099 enum cfnofile when_no_file; 1100 enum cflinkchildren when_linking_children; 1101 int link_children; 1102 } FileLink; 1103 1104 /*************************************************************************/ 1105 1106 typedef enum 1107 { 1108 SHELL_TYPE_NONE, 1109 SHELL_TYPE_USE, 1110 SHELL_TYPE_POWERSHELL 1111 } ShellType; 1112 1113 typedef struct 1114 { 1115 ShellType shelltype; 1116 mode_t umask; 1117 uid_t owner; 1118 gid_t group; 1119 char *chdir; 1120 char *chroot; 1121 int preview; 1122 bool nooutput; 1123 int timeout; 1124 } ExecContain; 1125 1126 /*************************************************************************/ 1127 1128 typedef struct 1129 { 1130 long min_range; 1131 long max_range; 1132 Rlist *in_range_define; 1133 Rlist *out_of_range_define; 1134 } ProcessCount; 1135 1136 /*************************************************************************/ 1137 1138 typedef struct 1139 { 1140 Rlist *owner; 1141 long min_pid; 1142 long max_pid; 1143 long min_ppid; 1144 long max_ppid; 1145 long min_pgid; 1146 long max_pgid; 1147 long min_rsize; 1148 long max_rsize; 1149 long min_vsize; 1150 long max_vsize; 1151 time_t min_ttime; 1152 time_t max_ttime; 1153 time_t min_stime; 1154 time_t max_stime; 1155 long min_pri; 1156 long max_pri; 1157 long min_thread; 1158 long max_thread; 1159 char *status; 1160 char *command; 1161 char *tty; 1162 char *process_result; 1163 } ProcessSelect; 1164 1165 #define PROCESS_SELECT_INIT { \ 1166 .owner = NULL, \ 1167 .min_pid = CF_NOINT, \ 1168 .max_pid = CF_NOINT, \ 1169 .min_ppid = CF_NOINT, \ 1170 .max_ppid = CF_NOINT, \ 1171 .min_pgid = CF_NOINT, \ 1172 .max_pgid = CF_NOINT, \ 1173 .min_rsize = CF_NOINT, \ 1174 .max_rsize = CF_NOINT, \ 1175 .min_vsize = CF_NOINT, \ 1176 .max_vsize = CF_NOINT, \ 1177 .min_ttime = CF_NOINT, \ 1178 .max_ttime = CF_NOINT, \ 1179 .min_stime = CF_NOINT, \ 1180 .max_stime = CF_NOINT, \ 1181 .min_pri = CF_NOINT, \ 1182 .max_pri = CF_NOINT, \ 1183 .min_thread = CF_NOINT, \ 1184 .max_thread = CF_NOINT, \ 1185 .status = NULL, \ 1186 .command = NULL, \ 1187 .tty = NULL, \ 1188 .process_result = NULL, \ 1189 } 1190 1191 /*************************************************************************/ 1192 1193 typedef struct 1194 { 1195 Constraint *expression; 1196 ContextScope scope; 1197 int nconstraints; 1198 int persistent; 1199 } ContextConstraint; 1200 1201 /*************************************************************************/ 1202 1203 typedef struct 1204 { 1205 BackupOption backup; 1206 int empty_before_use; 1207 int maxfilesize; 1208 int joinlines; 1209 int rotate; 1210 int inherit; 1211 } EditDefaults; 1212 1213 /*************************************************************************/ 1214 1215 typedef struct 1216 { 1217 Rlist *startwith_from_list; 1218 Rlist *not_startwith_from_list; 1219 Rlist *match_from_list; 1220 Rlist *not_match_from_list; 1221 Rlist *contains_from_list; 1222 Rlist *not_contains_from_list; 1223 } LineSelect; 1224 1225 typedef struct 1226 { 1227 char *build_xpath; 1228 char *select_xpath; 1229 char *attribute_value; 1230 int havebuildxpath; 1231 int haveselectxpath; 1232 int haveattributevalue; 1233 } EditXml; 1234 1235 typedef struct 1236 { 1237 char *line_matching; 1238 EditOrder before_after; 1239 char *first_last; 1240 } EditLocation; 1241 1242 typedef struct 1243 { 1244 char *select_start; 1245 char *select_end; 1246 int include_start; 1247 int include_end; 1248 bool select_end_match_eof; 1249 } EditRegion; 1250 1251 typedef struct 1252 { 1253 char *column_separator; 1254 int select_column; 1255 char value_separator; 1256 char *column_value; 1257 char *column_operation; 1258 int extend_columns; 1259 int blanks_ok; 1260 } EditColumn; 1261 1262 typedef struct 1263 { 1264 char *replace_value; 1265 char *occurrences; 1266 } EditReplace; 1267 1268 /*************************************************************************/ 1269 1270 typedef struct 1271 { 1272 char *mount_type; 1273 char *mount_source; 1274 char *mount_server; 1275 Rlist *mount_options; 1276 int editfstab; 1277 int unmount; 1278 } StorageMount; 1279 1280 typedef struct 1281 { 1282 int check_foreign; 1283 long freespace; 1284 int sensible_size; 1285 int sensible_count; 1286 int scan_arrivals; 1287 } StorageVolume; 1288 1289 /*************************************************************************/ 1290 1291 typedef struct 1292 { 1293 int haveprintfile; 1294 int havelastseen; 1295 int lastseen; 1296 char *result; 1297 double intermittency; 1298 char *friend_pattern; 1299 char *filename; 1300 char *to_file; 1301 int numlines; 1302 Rlist *showstate; 1303 } Report; 1304 1305 /*************************************************************************/ 1306 1307 typedef struct 1308 { 1309 PackageAction package_policy; 1310 char *package_version; 1311 Rlist *package_architectures; 1312 PackageVersionComparator package_select; 1313 PackageActionPolicy package_changes; 1314 Rlist *package_file_repositories; 1315 1316 char *package_default_arch_command; 1317 1318 char *package_list_command; 1319 char *package_list_version_regex; 1320 char *package_list_name_regex; 1321 char *package_list_arch_regex; 1322 char *package_patch_list_command; 1323 1324 char *package_patch_version_regex; 1325 char *package_patch_name_regex; 1326 char *package_patch_arch_regex; 1327 char *package_patch_installed_regex; 1328 1329 char *package_list_update_command; 1330 int package_list_update_ifelapsed; 1331 1332 char *package_version_regex; 1333 char *package_name_regex; 1334 char *package_arch_regex; 1335 char *package_installed_regex; 1336 1337 char *package_add_command; 1338 char *package_delete_command; 1339 char *package_update_command; 1340 char *package_patch_command; 1341 char *package_verify_command; 1342 char *package_noverify_regex; 1343 char *package_name_convention; 1344 char *package_delete_convention; 1345 1346 bool package_commands_useshell; 1347 1348 char *package_multiline_start; 1349 1350 char *package_version_less_command; 1351 char *package_version_equal_command; 1352 1353 int package_noverify_returncode; 1354 1355 bool has_package_method; 1356 bool is_empty; 1357 } Packages; 1358 1359 /*************************************************************************/ 1360 1361 typedef struct 1362 { 1363 char *name; 1364 int updates_ifelapsed; 1365 int installed_ifelapsed; 1366 Rlist *options; 1367 char *interpreter; 1368 char *module_path; 1369 } PackageModuleBody; 1370 1371 1372 typedef struct 1373 { 1374 Rlist *control_package_inventory; /* list of all inventory used package managers 1375 * names taken from common control */ 1376 char *control_package_module; /* policy default package manager name */ 1377 Seq *package_modules_bodies; /* list of all discovered in policy PackageManagerBody 1378 * bodies taken from common control */ 1379 } PackagePromiseContext; 1380 1381 1382 typedef struct 1383 { 1384 NewPackageAction package_policy; 1385 PackageModuleBody *module_body; 1386 Rlist *package_inventory; 1387 char *package_version; 1388 char *package_architecture; 1389 Rlist *package_options; 1390 1391 bool is_empty; 1392 } NewPackages; 1393 1394 /*************************************************************************/ 1395 1396 typedef enum 1397 { 1398 MEASURE_POLICY_AVERAGE, 1399 MEASURE_POLICY_SUM, 1400 MEASURE_POLICY_FIRST, 1401 MEASURE_POLICY_LAST, 1402 MEASURE_POLICY_NONE 1403 } MeasurePolicy; 1404 1405 typedef struct 1406 { 1407 char *stream_type; 1408 DataType data_type; 1409 MeasurePolicy policy; 1410 char *history_type; 1411 char *select_line_matching; 1412 int select_line_number; 1413 char *extraction_regex; 1414 char *units; 1415 int growing; 1416 } Measurement; 1417 1418 typedef struct 1419 { 1420 char *db_server_owner; 1421 char *db_server_password; 1422 char *db_server_host; 1423 char *db_connect_db; 1424 DatabaseType db_server_type; 1425 char *server; 1426 char *type; 1427 char *operation; 1428 Rlist *columns; 1429 Rlist *rows; 1430 Rlist *exclude; 1431 } Database; 1432 1433 /*************************************************************************/ 1434 typedef enum 1435 { 1436 USER_STATE_PRESENT, 1437 USER_STATE_ABSENT, 1438 USER_STATE_LOCKED, 1439 USER_STATE_NONE 1440 } UserState; 1441 1442 typedef enum 1443 { 1444 PASSWORD_FORMAT_PLAINTEXT, 1445 PASSWORD_FORMAT_HASH, 1446 PASSWORD_FORMAT_NONE 1447 } PasswordFormat; 1448 1449 typedef struct 1450 { 1451 UserState policy; 1452 char *uid; 1453 PasswordFormat password_format; 1454 char *password; 1455 char *description; 1456 char *group_primary; 1457 Rlist *groups_secondary; 1458 bool groups_secondary_given; 1459 char *home_dir; 1460 char *shell; 1461 } User; 1462 1463 /*************************************************************************/ 1464 1465 typedef struct 1466 { 1467 Rlist *service_depend; 1468 char *service_type; 1469 char *service_args; 1470 char *service_policy; 1471 char *service_autostart_policy; 1472 char *service_depend_chain; 1473 FnCall *service_method; 1474 } Services; 1475 1476 /*************************************************************************/ 1477 1478 typedef enum 1479 { 1480 ENVIRONMENT_STATE_CREATE, 1481 ENVIRONMENT_STATE_DELETE, 1482 ENVIRONMENT_STATE_RUNNING, 1483 ENVIRONMENT_STATE_SUSPENDED, 1484 ENVIRONMENT_STATE_DOWN, 1485 ENVIRONMENT_STATE_NONE 1486 } EnvironmentState; 1487 1488 typedef struct 1489 { 1490 int cpus; 1491 int memory; 1492 int disk; 1493 char *baseline; 1494 char *spec; 1495 Rlist *addresses; 1496 char *name; 1497 char *host; 1498 char *type; 1499 EnvironmentState state; 1500 } Environments; 1501 1502 /* This is huge, but the simplification of logic is huge too 1503 so we leave it to the compiler to optimize */ 1504 1505 #include <json.h> 1506 1507 typedef struct 1508 { 1509 const char *source; 1510 const char *port; /* port or service name */ 1511 char *destination; 1512 FileComparator compare; 1513 FileLinkType link_type; 1514 Rlist *servers; 1515 Rlist *link_instead; 1516 Rlist *copy_links; 1517 BackupOption backup; 1518 int stealth; 1519 int preserve; 1520 int collapse; /* collapse_destination_dir */ 1521 int check_root; 1522 int type_check; 1523 int force_update; 1524 int force_ipv4; 1525 size_t min_size; /* Safety margin not search criterion */ 1526 size_t max_size; 1527 int trustkey; 1528 int encrypt; 1529 int verify; 1530 int purge; 1531 short timeout; 1532 ProtocolVersion protocol_version; 1533 bool missing_ok; 1534 } FileCopy; 1535 1536 typedef struct 1537 { 1538 FileSelect select; 1539 FilePerms perms; 1540 FileCopy copy; 1541 FileDelete delete; 1542 char *content; 1543 FileRename rename; 1544 FileChange change; 1545 FileLink link; 1546 EditDefaults edits; 1547 Packages packages; 1548 NewPackages new_packages; 1549 ContextConstraint context; 1550 Measurement measure; 1551 Acl acl; 1552 Database database; 1553 Services service; 1554 User users; 1555 Environments env; 1556 char *transformer; 1557 char *pathtype; 1558 char *file_type; 1559 char *repository; 1560 char *edit_template; 1561 char *edit_template_string; 1562 char *template_method; 1563 JsonElement *template_data; 1564 int touch; 1565 int create; 1566 int move_obstructions; 1567 int inherit; 1568 1569 DirectoryRecursion recursion; 1570 TransactionContext transaction; 1571 DefineClasses classes; 1572 1573 ExecContain contain; 1574 char *args; 1575 Rlist *arglist; 1576 int module; 1577 bool inform; 1578 1579 Rlist *signals; 1580 char *process_stop; 1581 char *restart_class; 1582 ProcessCount process_count; 1583 ProcessSelect process_select; 1584 1585 Report report; 1586 StorageMount mount; 1587 StorageVolume volume; 1588 1589 int havedepthsearch; 1590 int haveselect; 1591 int haverename; 1592 int havedelete; 1593 int haveperms; 1594 int havechange; 1595 int havecopy; 1596 int havelink; 1597 int haveeditline; 1598 int haveeditxml; 1599 int haveedit; 1600 int havecontain; 1601 int haveclasses; 1602 int havetrans; 1603 int haveprocess_count; 1604 int havemount; 1605 int havevolume; 1606 int havebundle; 1607 int havepackages; 1608 1609 /* editline */ 1610 1611 EditRegion region; 1612 EditLocation location; 1613 EditColumn column; 1614 EditReplace replace; 1615 EditXml xml; 1616 int haveregion; 1617 int havelocation; 1618 int havecolumn; 1619 int havereplace; 1620 int haveinsertselect; 1621 int havedeleteselect; 1622 LineSelect line_select; 1623 char *sourcetype; 1624 int expandvars; 1625 int not_matching; 1626 Rlist *insert_match; 1627 } Attributes; 1628 1629 #define ZeroAttributes {\ 1630 .select = {0},\ 1631 .perms = {0},\ 1632 .copy = {0},\ 1633 .delete = {0},\ 1634 .content = NULL,\ 1635 .rename = {0},\ 1636 .change = {0},\ 1637 .link = {0},\ 1638 .edits = {0},\ 1639 .packages = {0},\ 1640 .new_packages = {0},\ 1641 .context = {0},\ 1642 .measure = {0},\ 1643 .acl = {0},\ 1644 .database = {0},\ 1645 .service = {0},\ 1646 .users = {0},\ 1647 .env = {0},\ 1648 .transformer = NULL,\ 1649 .pathtype = NULL,\ 1650 .file_type = NULL,\ 1651 .repository = NULL,\ 1652 .edit_template = NULL,\ 1653 .edit_template_string = NULL,\ 1654 .template_method = NULL,\ 1655 .template_data = NULL,\ 1656 .touch = 0,\ 1657 .create = 0,\ 1658 .move_obstructions = 0,\ 1659 .inherit = 0,\ 1660 .recursion = { 0 },\ 1661 .transaction = { 0 },\ 1662 .classes = { 0 },\ 1663 .contain = { 0 },\ 1664 .args = NULL,\ 1665 .arglist = NULL,\ 1666 .module = 0,\ 1667 .inform = false,\ 1668 .signals = NULL,\ 1669 .process_stop = NULL,\ 1670 .restart_class = NULL,\ 1671 .process_count = { 0 },\ 1672 .process_select = { 0 },\ 1673 .report = { 0 },\ 1674 .mount = { 0 },\ 1675 .volume = { 0 },\ 1676 .havedepthsearch = 0,\ 1677 .haveselect = 0,\ 1678 .haverename = 0,\ 1679 .havedelete = 0,\ 1680 .haveperms = 0,\ 1681 .havechange = 0,\ 1682 .havecopy = 0,\ 1683 .havelink = 0,\ 1684 .haveeditline = 0,\ 1685 .haveeditxml = 0,\ 1686 .haveedit = 0,\ 1687 .havecontain = 0,\ 1688 .haveclasses = 0,\ 1689 .havetrans = 0,\ 1690 .haveprocess_count = 0,\ 1691 .havemount = 0,\ 1692 .havevolume = 0,\ 1693 .havebundle = 0,\ 1694 .havepackages = 0,\ 1695 .region = { 0 },\ 1696 .location = { 0 },\ 1697 .column = { 0 },\ 1698 .replace = { 0 },\ 1699 .xml = { 0 },\ 1700 .haveregion = 0,\ 1701 .havelocation = 0,\ 1702 .havecolumn = 0,\ 1703 .havereplace = 0,\ 1704 .haveinsertselect = 0,\ 1705 .havedeleteselect = 0,\ 1706 .line_select = { 0 },\ 1707 .sourcetype = NULL,\ 1708 .expandvars = 0,\ 1709 .not_matching = 0,\ 1710 .insert_match = NULL\ 1711 } 1712 1713 /*************************************************************************/ 1714 /* common macros */ 1715 /*************************************************************************/ 1716 1717 #include <rlist.h> 1718 #include <dbm_api.h> 1719 #include <sequence.h> 1720 #include <prototypes3.h> 1721 #include <alloc.h> 1722 #include <cf3.extern.h> 1723 1724 extern const ConstraintSyntax CF_COMMON_BODIES[]; 1725 extern const ConstraintSyntax CF_VARBODY[]; 1726 extern const PromiseTypeSyntax *const CF_ALL_PROMISE_TYPES[]; 1727 extern const ConstraintSyntax CFG_CONTROLBODY[]; 1728 extern const BodySyntax CONTROL_BODIES[]; 1729 extern const ConstraintSyntax CFH_CONTROLBODY[]; 1730 extern const PromiseTypeSyntax CF_COMMON_PROMISE_TYPES[]; 1731 extern const ConstraintSyntax CF_CLASSBODY[]; 1732 extern const ConstraintSyntax CFA_CONTROLBODY[]; 1733 extern const ConstraintSyntax CFEX_CONTROLBODY[]; 1734 1735 typedef struct ServerConnectionState_ ServerConnectionState; 1736 1737 #endif 1738